#include "my_dht11.h"
#define DHT11 P46
#define CHECK_LEVEL_COUNT(LEVEL,MIN_VAL,MAX_VAL,FLAG)     count=0;\
                                                            do{\
                                                                count++;\
                                                                NOP11();\
                                                            }while(DHT11==LEVEL);\
                                                            if(count<MIN_VAL || count>MAX_VAL){\
                                                                show_dht11_error(FLAG);\
                                                                printf("error count=%d\n",count);\
                                                                return FLAG;\
                                                            }\

                                                                                        
void DHT11_GPIO_Config()
{
	GPIO_InitTypeDef init;
	init.Mode = GPIO_PullUp;
	init.Pin = GPIO_Pin_6;
	GPIO_Inilize(GPIO_P4, &init);
}
void show_dht11_error(u8 get_flag){
    if(get_flag==-1){
        printf("主机高电平释放时间错误\n");
    }else if(get_flag==-2){
        printf("从机响应低电平时间错误\n");
    }else if(get_flag==-3){
        printf("从机响应高电平时间错误\n");
    }else if(get_flag==-4){
        printf("从机判断低电平截止符错误\n");
    }else if(get_flag==-5){
        printf("从机响应信号0-1时间错误\n");
    }else if(get_flag==-6){
        printf("校验错误\n");
    }
}
u8 debug_val[3]={0};
char START_DHT11(DHT11_Status *status){
    u8 flag=0;
    u8 dat[5]={0};
    int i,j;
    int count;
    float humidity;
    float temp;
    DHT11=0;
    delay_ms(20);
    DHT11=1;
    // 主机释放总线时间过长
    CHECK_LEVEL_COUNT(1,10,35,-1);
    debug_val[0]=count;
    // printf("count0=%d\n",count);
    // // 计算高电平时间
    // // 计算相应低电平时间
    // //从机响应低电平时间过长
    CHECK_LEVEL_COUNT(0,78,88,-2);
    debug_val[1]=count;
    // printf("count2=%d\n",count);
    // // // 计算重新拉起的高电平时间
    // // 从机响应高电平时间过长
    CHECK_LEVEL_COUNT(1,80,92,-3);
    debug_val[2]=count;
    // printf("count2=%d",count);
    // // 循环接收数据
    for( i=0;i<5;i++){
        for(j=7;j>=0;j--){
            // 这里判断电压低,是判断截止符
            CHECK_LEVEL_COUNT(0,45,58,-4);
            // printf("count-0=%d",count);
            //这里根据电压持续时间,判断0-1
            CHECK_LEVEL_COUNT(1,23,74,-5);
            // printf("count-0=%d",count);
            if(count>40){
            	dat[i] |=(1<<j);
            }
        }
    }
    // 校验
    if(dat[0]+dat[1]+dat[2]+dat[3]==dat[4]){
    	// float humidity;
        humidity=dat[0];
        // float temp;
        temp=dat[2]+(dat[3]&(~(1<<7)))/10.0;
        ((dat[3]&(1<<7))>0)>0?temp=-temp:temp;
        status->DHT11_Humidity=humidity;
        status->DHT11_Temp=temp;
        return 0;
    }
        return -6;
}
void get_debug_info(){
    printf("debug_val[0]=%d\n",(int)debug_val[0]);
    printf("debug_val[1]=%d\n",(int)debug_val[1]);
    printf("debug_val[2]=%d\n",(int)debug_val[2]);
}